package com.wwt.server.utils;


import com.wwt.server.properties.JwtProperties;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.util.StringUtils;

import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * JWT工具类  生成与检验
 */
public class JWTUtils {
     private static final String CLAIM_KEY_USERNAME="sub";  //用户名字段
     private static final String CLAIM_KEY_CREATED="created";  //创建时间字段

    private static String sign= JwtProperties.secret;  //签名秘钥
    private static Integer expiration= JwtProperties.expiration;  //过期时间

    //通用类  被具体的调用
    private static String createToken(Map<String,Object> claimMap){
        Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.SECOND,expiration);
        return Jwts.builder().setClaims(claimMap)
                       .setExpiration(calendar.getTime())
                        .signWith(SignatureAlgorithm.HS512,sign)
                        .compact();  //压缩为一个String
    }
    /** 用户具体调用生成Token
     * @param userDetails
     * @return token
     */
    public static String createTokenByUser(UserDetails userDetails){
        String username=userDetails.getUsername();
        Date createTime=new Date();
//        DateFormat format = DateFormat.getDateInstance();
//        format.format(new Date());
        HashMap<String, Object> map = new HashMap();
        map.put(CLAIM_KEY_USERNAME,username);
        map.put(CLAIM_KEY_CREATED,createTime);
        return createToken(map);
    }

    /**
     * 获取负载
     * @param token
     * @return 负载（信息）
     */

    private static Claims getClaimByToken(String token){
        Claims claims=null;
        try{
            claims=Jwts.parser()
                    .setSigningKey(sign)
                    .parseClaimsJws(token)
                    .getBody();
        }catch (Exception e){
            e.printStackTrace();
        }
        return claims;
    }

    /**
     * @Des 校验Token合法性
     * @param token
     * @param user
     * @return
     */
    public static Boolean validateToken(String token,UserDetails user){
        if (StringUtils.hasLength(token) && user != null){
            if (getNameByToken(token).equals(user.getUsername()) && !isExpiration(token))
                return true;
        }
        return false;
    }

    /**
     * 从Token获取用户名
     * @param token
     * @return 用户名
     */
    public static String getNameByToken(String token){
       return getClaimByToken(token).getSubject();
    }
    /**
     * 判断Token是否过期
     * @param token
     * @return
     */
    private static Boolean isExpiration(String token){
        Date expiration = getClaimByToken(token).getExpiration();
        return expiration.before(new Date());
    }
    /**
     * 判断Token是否可被刷新 即是否过期
     * @param token
     * @return
     */
    public static Boolean isFlush(String token){
        return !isExpiration(token);
    }

    /**
     * 刷新Token
     * @param token
     * @return
     */
    public static String flushToken(String token){
        Claims claim = getClaimByToken(token);
        claim.put(CLAIM_KEY_CREATED,new Date());
        return createToken(claim);
    }

}
